/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package utils;

import java.io.*;
import java.lang.reflect.Method;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.Session;

/**
 *
 * @author Elvia
 */
public class FuncionesGenericas {

    public List<SelectItem> cargarSelectItems(List lstObjetos, String metodoId) {
        List<SelectItem> select = new ArrayList<>();
        Method getId, getDescripcion;
        metodoId = "get" + metodoId.substring(0, 1).toUpperCase() + metodoId.substring(1, metodoId.length());
        try {
            int cont = 0;
            for (Iterator it = lstObjetos.iterator(); it.hasNext();) {

                Object object = it.next();

                Class objeto = object.getClass();

                getId = objeto.getMethod(metodoId, new Class[0]);
                Object id = getId.invoke(object, new Object[0]);

                SelectItem sitem = new SelectItem();
                sitem.setValue(id);
                sitem.setLabel(object.toString().toUpperCase());
                
                //Valido si el item no tiene valores del Item no se debe agregar al listado.
                if (!(object.toString().toUpperCase().equals(""))) {
                    select.add(sitem);
                }

                cont++;
            }

            return select;
        } catch (Exception e) {
            return null;
        }
    }

    //Ingresa el valor de Null en el primer Item
    public List<SelectItem> cargarSelectItemsMasNull(List lstObjetos, String metodoId,String TextoNull) {
        List<SelectItem> select = new ArrayList<>();
        Method getId, getDescripcion;
        metodoId = "get" + metodoId.substring(0, 1).toUpperCase() + metodoId.substring(1, metodoId.length());
        try {
            int cont = 0;

            //Cargo el valor de null:
            SelectItem sitem0 = new SelectItem();
            sitem0.setValue(0);
            sitem0.setLabel("- "+TextoNull+" -");
            select.add(sitem0);

            for (Iterator it = lstObjetos.iterator(); it.hasNext();) {

                Object object = it.next();

                Class objeto = object.getClass();

                getId = objeto.getMethod(metodoId, new Class[0]);
                Object id = getId.invoke(object, new Object[0]);

                SelectItem sitem = new SelectItem();
                sitem.setValue(id);
                sitem.setLabel(object.toString().toUpperCase());

                //Valido si el item no tiene valores del Item no se debe agregar al listado.
                if (!(object.toString().toUpperCase().equals(""))) {
                    select.add(sitem);
                }

                cont++;
            }

            return select;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     *
     * Creado: Angel Cuenca
     *
     * @param lstObjetos : lista de objetos que se pasarán al selectitem
     * @param metodoId : nombre del método del id que tendrá el selectitem
     * @param metodoDescripcion : nombre del método de la descripción que tendrá
     * el selectitem
     * @param idInicial : id del valor de la primera posicion de la lista, si no
     * se desea se envia NULL
     * @param descripcionInicial : descripcion del valor de la primera posicion
     * de la lista, si no se desea se envia NULL
     * @return : lista de selectitem con un valor por defecto en la primera
     * posicion
     */
    public SelectItem[] cargarSelectItems(List lstObjetos, String metodoId, String metodoDescripcion, String idInicial, String descripcionInicial) {
        SelectItem[] select = new SelectItem[lstObjetos.size() + 1];
        Method getId, getDescripcion;
        try {
            int cont = 0;
            if (idInicial != null) {
                select[cont] = new SelectItem(idInicial, descripcionInicial.toUpperCase());
                cont++;
            }
            for (Iterator it = lstObjetos.iterator(); it.hasNext();) {
                Object object = it.next();
                Class objeto = object.getClass();
                getId = objeto.getMethod(metodoId, new Class[0]);
                String id = getId.invoke(object, new Object[0]).toString();
                getDescripcion = objeto.getMethod(metodoDescripcion, new Class[0]);
                String descripcion = getDescripcion.invoke(object, new Object[0]).toString();
                select[cont] = new SelectItem(id, descripcion.toUpperCase());
                cont++;
            }
            return select;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     *
     * Creado: Angel Cuenca
     *
     * @param lstObjetos : lista de objetos que se pasarán al selectitem
     * @param metodoId : nombre del método del id que tendrá el selectitem
     * @param metodoDescripcion : nombre del método de la descripción que tendrá
     * el selectitem
     * @return : lista de selectitem
     */
    public SelectItem[] cargarSelectItems(List lstObjetos, String metodoId, String metodoDescripcion) {
        SelectItem[] select = new SelectItem[lstObjetos.size()];
        Method getId, getDescripcion;
        try {
            int cont = 0;
            for (Iterator it = lstObjetos.iterator(); it.hasNext();) {
                Object object = it.next();
                Class objeto = object.getClass();
                getId = objeto.getMethod(metodoId, new Class[0]);
                String id = getId.invoke(object, new Object[0]).toString();
                getDescripcion = objeto.getMethod(metodoDescripcion, new Class[0]);
                String descripcion = getDescripcion.invoke(object, new Object[0]).toString();
                select[cont] = new SelectItem(id, descripcion.toUpperCase());
                cont++;
            }

            return select;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * Creado: Angel Cuenca
     *
     * @param lstObjetos : lista de objetos que se pasarán al selectitem
     * @param metodoDescripcion : nombre del método de la descripción que tendrá
     * el selectitem
     * @param objetoInicial : objeto para el valor de la primera posicion de la
     * lista, si no se desea se envia NULL
     * @return : lista de selectitem
     */
    public SelectItem[] cargarSelectItems(List lstObjetos, String metodoDescripcion, Object objetoInicial) {
        SelectItem[] select = new SelectItem[lstObjetos.size() + 1];
        Method getDescripcion;
        try {
            int cont = 0;
            if (objetoInicial != null) {
                Class objIni = objetoInicial.getClass();
                getDescripcion = objIni.getMethod(metodoDescripcion, new Class[0]);
                String descripcion = (String) getDescripcion.invoke(objetoInicial, new Object[0]);
                select[cont] = new SelectItem(Integer.toString(cont), descripcion.toUpperCase());
                cont++;
            }
            for (Iterator it = lstObjetos.iterator(); it.hasNext();) {
                Object object = it.next();
                Class objeto = object.getClass();
                getDescripcion = objeto.getMethod(metodoDescripcion, new Class[0]);
                String descripcion = (String) getDescripcion.invoke(object, new Object[0]);
                select[cont] = new SelectItem(Integer.toString(cont), descripcion.toUpperCase());
                cont++;
            }
            return select;
        } catch (Exception e) {
            return null;
        }
    }

    public LinkedHashMap<Object, Object> cargarLinkedHashMap(List lstDatos, String metodoId) {
        LinkedHashMap<Object, Object> lhmDatos = new LinkedHashMap<Object, Object>();
        Method getId, getDescripcion;
        try {
            for (Iterator it = lstDatos.iterator(); it.hasNext();) {
//                    Object objeto = it.next();
//                    Class oClase = objeto.getClass();
//                Method metodo = oClase.getMethod(metodoId, boolean.class);
//                metodo.invoke(objeto, seleccion);
                Object objeto = it.next();
                Class oClase = objeto.getClass();
                getId = oClase.getMethod(metodoId, new Class[0]);
                String id = getId.invoke(objeto, new Object[0]).toString();
//                getDescripcion = oClase.getMethod(metodoDescripcion, new Class[0]);
//                String descripcion = getDescripcion.invoke(objeto, new Object[0]).toString();
//                select[cont] = new SelectItem(id, descripcion.toUpperCase());
                lhmDatos.put(id, objeto);
            }
            return lhmDatos;
        } catch (Exception e) {
            return null;
        }

    }

    /*
     *
     * Daniel
     *
     */
    public List<SelectItem> cargarSelectItemsListSel(List lstObjetos, String metodoDescripcion) {
//        List<SelectItem> listaLlenar = new ArrayList<SelectItem>();
//        Method getDescripcion;
//        Method getId;

        //Pogo El seleccionar en el primer Item del combo:
        SelectItem item = new SelectItem();
        item.setLabel("-SELECCIONE-");
        item.setValue(null);

        return cargarItemsList(lstObjetos, metodoDescripcion, item);
//        listaLlenar.add(item);
//
//        //Es una entidad:
//        try {
//            int cont = 0;
//            for (int ns = 0; ns < lstObjetos.size(); ns++) {
//                item = new SelectItem();
//
//                Object object = lstObjetos.get(ns);
//                Class objeto = object.getClass();
//                String p = metodoDescripcion.substring(0, 1).toUpperCase();
//                getDescripcion = objeto.getMethod("get" + p + metodoDescripcion.substring(1, metodoDescripcion.length()), new Class[0]);
//                String descripcion = (String) getDescripcion.invoke(object, new Object[0]);
//
//                item.setLabel(descripcion);
//
//
//                getId = objeto.getMethod("getId", new Class[0]);
//                int id = (Integer) getId.invoke(object, new Object[0]);
//
//
//                item.setValue(id);
//                listaLlenar.add(item);
//
//
//            }
//            return listaLlenar;
//        } catch (Exception e) {
//
//
//
//            //Es una lista de Objetos 
//            try {
//
//                for (int ns = 0; ns < lstObjetos.size(); ns++) {
//                    item = new SelectItem();
//
//                    item.setLabel(lstObjetos.get(ns).toString());
//                    item.setValue(ns + 1);
//                    listaLlenar.add(item);
//
//
//                }
//                return listaLlenar;
//            } catch (Exception e1) {
//                return null;
//            }
//
//        }

    }

    public List<SelectItem> cargarSelectItemsList(List lstObjetos, String metodoDescripcion, String label) {
        //Pogo El seleccionar en el primer Item del combo:
        SelectItem item = new SelectItem();
        item.setLabel(label);
        item.setValue(null);
        return cargarItemsList(lstObjetos, metodoDescripcion, item);
    }

    public List<SelectItem> cargarItemsList(List lstObjetos, String metodoDescripcion, SelectItem item) {
        Method getDescripcion;
        Method getId;
        List<SelectItem> listaLlenar = new ArrayList<SelectItem>();

        listaLlenar.add(item);

        //Es una entidad:
        try {
            int cont = 0;
            for (int ns = 0; ns < lstObjetos.size(); ns++) {
                item = new SelectItem();

                Object object = lstObjetos.get(ns);
                Class objeto = object.getClass();
                String p = metodoDescripcion.substring(0, 1).toUpperCase();
                getDescripcion = objeto.getMethod("get" + p + metodoDescripcion.substring(1, metodoDescripcion.length()), new Class[0]);
                String descripcion = (String) getDescripcion.invoke(object, new Object[0]);

                item.setLabel(descripcion);

                getId = objeto.getMethod("getId", new Class[0]);
                int id = (Integer) getId.invoke(object, new Object[0]);

                item.setValue(id);
                listaLlenar.add(item);

            }
            return listaLlenar;
        } catch (Exception e) {
            //Es una lista de Objetos 
            try {
                for (int ns = 0; ns < lstObjetos.size(); ns++) {
                    item = new SelectItem();

                    item.setLabel(lstObjetos.get(ns).toString());
                    item.setValue(ns + 1);
                    listaLlenar.add(item);
                }
                return listaLlenar;
            } catch (Exception e1) {
                return null;
            }
        }
    }

    public void redireccionar(String paginaDestino) {
        try {
            FacesContext faces = FacesContext.getCurrentInstance();
            ExternalContext context = faces.getExternalContext();
            String ctxPath
                    = ((ServletContext) context.getContext()).getContextPath();
            context.getRequest();
            String url = ctxPath + "/faces/prot/" + paginaDestino + ".xhtml";
            context.redirect(url);
            faces.responseComplete();
        } catch (IOException ex) {
        }
    }

    public void redireccionar(String paginaDestino, String parametros) {
        try {
            FacesContext faces = FacesContext.getCurrentInstance();
            ExternalContext context = faces.getExternalContext();
            String ctxPath
                    = ((ServletContext) context.getContext()).getContextPath();
            context.getRequest();
            String url = ctxPath + "/faces/prot/" + paginaDestino + ".xhtml";
            context.redirect(url+parametros);
            faces.responseComplete();
        } catch (IOException ex) {
        }
    }
    
    
   

    public void mostrarError(String mensaje) {

        FacesContext.getCurrentInstance().addMessage("", new FacesMessage(FacesMessage.SEVERITY_INFO, mensaje, mensaje));
    }

    //Generar Reportes
    public static String DIRECCION_GENERAL_ARCHIVOS = "/resources/archivos/investigacion/";

//    public static String proGenerarPdfDeReporte(String rutaReporte, String file, String nombreReporte, Class clase, String nombrePdf, Map parametrosReporte) {
//        Session sesion = HibSession.abrirSesion();
//        Connection conexion = sesion.connection();
//        try {
//
//            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
//
//            Date fechaActual = new Date();
//            SimpleDateFormat formato = new SimpleDateFormat("ddMMyyyyHHss");
//            String fechaString = formato.format(fechaActual);
//
//            nombrePdf = nombrePdf + "_" + fechaString + ".pdf";
//
//            //xxxxxx
////            String rutaPdf = "./docroot/";
//            String rutaPdf = DIRECCION_GENERAL_ARCHIVOS;
//
//
//            String pathReporte = rutaReporte + nombreReporte;
//            String pathPdf = rutaPdf + nombrePdf;
//
//            URL url = clase.getResource(pathReporte);
//            String archivo = url.getPath();//path completo
//
////            JasperReport reporte = (JasperReport) JRLoader.loadObject(archivo);
//////            JasperReport reporte = JasperCompileManager.compileReport(archivo);
////
////            JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametrosReporte, conexion);
////            JRExporter exporter = new JRPdfExporter();
////            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
////            exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File(pathPdf));
////            exporter.exportReport();
//
//
//
//
//            return "../VisualizaDocumentos?path=" + nombrePdf + "&file=" + file;
//
//
//        } catch (Exception e) {
//            System.out.println("Error: FuncionesGenericas "
//                    + "metodo: proGenerarPdfDeReporte(String rutaReporte, String nombreReporte, Class clase, String nombrePdf) --"
//                    + "  " + e.getMessage());
//            e.printStackTrace();
//            return "";
//
//        } finally {
//            try {
//                conexion.close();
//                HibSession.cerrarSesion();
//            } catch (SQLException ex) {
//                Logger.getLogger(FuncionesGenericas.class.getName()).log(Level.SEVERE, null, ex);
//                System.out.println("Error: FuncionesGenericas  metodo: proGenerarPdfDeReporte en finally " + ex.getMessage());
//            }
//        }
//
//    }
//
//    public void accionDescargarFalso(String nombreArchivo, int id) throws IOException {
//        SgeiParametrosDAO parametrosDAO = new SgeiParametrosDAO();
//        SgeiParametros ocontantes = (SgeiParametros) parametrosDAO.getParametrosXid(6, SgeiParametros.class);
//        DIRECCION_GENERAL_ARCHIVOS = ocontantes.getValor();
//        FacesContext context = FacesContext.getCurrentInstance();
//        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
//        OutputStream out = null;
////        controlador.Utils utils = new Utils();
////        SgiPropuestas objSgiPropuestas = (SgiPropuestas) funObjetoSeleccionado();
//
//        response.setContentType("application/download");
//        response.setHeader("Content-disposition", "inline; filename="
//                + nombreArchivo);
//        response.setHeader("Cache-Control", "max-age=30");
//        response.setHeader("Pragma", "No-cache");
//        response.setDateHeader("Expires", 0);
////        response.
//
//        File archivo = new File(DIRECCION_GENERAL_ARCHIVOS + nombreArchivo);
//        FileInputStream fichero = null;
//        try {
//            fichero = new FileInputStream(archivo);
//            out = response.getOutputStream();
//        } catch (Exception e) {
//            if (id != 0) {
//                SgeiArchivos objArchivo = new SgeiArchivos();
//                SgeiArchivosDAO objArchivDao = new SgeiArchivosDAO();
//                objArchivo = objArchivDao.getArchivoXEvidencia(id);
//                if (objArchivo != null) {
//                    subirArchivoServidor(objArchivo.getArchivo(), objArchivo.getSgeiEvidencias().getArchivo());
//                    archivo = new File(DIRECCION_GENERAL_ARCHIVOS + nombreArchivo);
//                    fichero = new FileInputStream(archivo);
//                    out = response.getOutputStream();
//                }
//            }
//
//        }
//        if (fichero != null) {
//            byte[] buf = new byte[1024];
//            int len;
//            while ((len = fichero.read(buf)) > 0) {
//                out.write(buf, 0, len);
//            }
//            fichero.close();
//        }
//        //Escribir en bloques y no todo el contenido
//        if (out != null) {
//            out.flush();
//            out.close();
//        }
//
//
////        return "";
//    }
//
//    public List<SgeiArchivos> subirEvidenciasDeResultadoBase(SgeiResultados objResultado) throws IOException {
//        List<SgeiArchivos> lstArchivos = new ArrayList<SgeiArchivos>();
//        SgeiEvidenciasDAO objEvidenciaDao = new SgeiEvidenciasDAO();
//        if (objResultado != null) {
//            List lstEvidencias = objEvidenciaDao.getEvidenciasXRespuesta(objResultado.getId());
//            if (lstEvidencias != null) {
//                for (Iterator<SgeiEvidencias> it = lstEvidencias.iterator(); it.hasNext();) {
//                    SgeiEvidencias obj = it.next();
//                    SgeiArchivos objArchivo = new SgeiArchivos();
//                    objArchivo = subirArchivoBase(objResultado, obj);
//                    lstArchivos.add(objArchivo);
//                }
//            }
//        }
//        return lstArchivos;
//        //        return "";
//    }
//
//    public SgeiArchivos subirArchivoBase(SgeiResultados objResultado, SgeiEvidencias objEvidencia) throws IOException {
//        SgeiParametrosDAO parametrosDAO = new SgeiParametrosDAO();
//        SgeiParametros ocontantes = (SgeiParametros) parametrosDAO.getParametrosXid(6, SgeiParametros.class);
//        DIRECCION_GENERAL_ARCHIVOS = ocontantes.getValor();
//        FacesContext context = FacesContext.getCurrentInstance();
//        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
//        OutputStream out = null;
//        String nombreArchivo = "";
//        SgeiEvidenciasDAO objEvidenciaDao = new SgeiEvidenciasDAO();
//        nombreArchivo = objEvidencia.getArchivo();
//        //        controlador.Utils utils = new Utils();
//        //        SgiPropuestas objSgiPropuestas = (SgiPropuestas) funObjetoSeleccionado();
//        response.setContentType("application/download");
//        response.setHeader("Content-disposition", "inline; filename="
//                + nombreArchivo);
//        response.setHeader("Cache-Control", "max-age=30");
//        response.setHeader("Pragma", "No-cache");
//        response.setDateHeader("Expires", 0);
////        response.
//
//        File archivo = new File(DIRECCION_GENERAL_ARCHIVOS + nombreArchivo);
//        FileInputStream fichero = null;
//        try {
//            if (archivo.exists()) {
//                fichero = new FileInputStream(archivo);
//                out = response.getOutputStream();
//                SgeiArchivos objArchivo = new SgeiArchivos();
//                SgeiArchivosDAO objArchivDao = new SgeiArchivosDAO();
//                objArchivo = objArchivDao.getArchivoXEvidencia(objEvidencia.getId());
//                if (objArchivo == null) {
//                    if (objEvidencia == null) {
//                    } else {
//                        if (fichero != null) {
//                            byte[] buf = new byte[1024];
//                            fichero.read(buf);
//                            fichero.close();
//                            objArchivo = new FuncionesComunes().llenarArchivo(nombreArchivo, objEvidencia.getSgeiResultados().getSgeiIndicadorRespuestas().getId(), buf, objEvidencia);
//                            objArchivo = new FuncionesComunes().llenarArchivosIdEvidencia(objEvidencia, objArchivo);
//                            return objArchivo;
//                        }
//                    }
//                }
//                if (out != null) {
//                    out.flush();
//                    out.close();
//                }
//            }
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return null;
//        //        return "";
//    }
//
//    public void subirArchivoServidor(byte[] archivo, String nombre) {
//        try {
//            SgeiParametrosDAO parametrosDAO = new SgeiParametrosDAO();
//            SgeiParametros oContantes = (SgeiParametros) parametrosDAO.getParametrosXid(5, SgeiParametros.class);
////            String formatos = oContantes.getValor();
////            String Vformatos[] = FuncionesGenericas.funRegresaTokens(formatos, "|");
////            nombreArchivo = nombreArchivo();
//            oContantes = (SgeiParametros) parametrosDAO.getParametrosXid(6, SgeiParametros.class);
//            ///resources/archivos/investigacion/
////            System.out.println("oContantes");
//            String pathArchivo = oContantes.getValor() + nombre;
//
//            FileOutputStream fileOut = new FileOutputStream(pathArchivo);
//
//            BufferedOutputStream buffer = new BufferedOutputStream(fileOut);
//            buffer.write(archivo);
//            buffer.flush();
//            buffer.close();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//    }
    public static String[] funRegresaTokens(String cadena, String token) {
        String datos[];
        try {
            StringTokenizer tokens = new StringTokenizer(cadena, token);
            int nDatos = tokens.countTokens();
            datos = new String[nDatos];
            int i = 0;
            while (tokens.hasMoreTokens()) {
                String str = tokens.nextToken();
                datos[i] = (str);
                i++;

            }

        } catch (Exception e) {
            System.out.println("Error FuncionesGenericas metodo: funRegresaTokens(String cadena, String token)");
            datos = null;
        }
        return datos;
    }
    

    
        /*
     * <%@page import="net.sf.jasperreports.engine.*" %> <%@page
     * import="java.util.*" %> <%@page import="java.io.*" %> <%@page
     * import="java.sql.Connection" %> <%@page import="java.sql.DriverManager"
     * %> * <% final String jdbc ="com.mysql.jdbc.Driver" ; final String db =
     * "jdbc:mysql://localhost/hos?characterEncoding=tis620&user=sa&password=sa"
     * ; Connection con = null ; * try { Class.forName(jdbc).newInstance(); con
     * = DriverManager.getConnection(db); }catch(Exception ex){
     * System.out.println("Initial SQL Error:"+ ex.getMessage()); * } * File
     * reportFile =new File(application.getRealPath("report/i_pttypes.jrxml"));
     * * if (!reportFile.exists()) throw new JRRuntimeException("File not
     * found.The report design must be compiled first."); * byte[] bytes
     * =JasperRunManager.runReportToPdf(reportFile.getPath(),null,con); *
     *
     * response.setContentType("appliction/pdf");
     * response.setContentLength(bytes.length); ServletOutputStream outputStream
     * = response.getOutputStream(); outputStream.write(bytes,0,bytes.length);
     * outputStream.flush(); outputStream.close(); *
     *
     * %>
     */
}
